/*
 * 代号：凤凰
 * http://www.jphenix.org
 * 2022年8月27日
 * V4.0
 */
package com.jphenix.servlet.api.javax;

import java.io.BufferedReader;
import java.io.IOException;
import java.security.Principal;
import java.util.Collection;
import java.util.Enumeration;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import javax.servlet.AsyncContext;
import javax.servlet.DispatcherType;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpUpgradeHandler;
import javax.servlet.http.Part;

import com.jphenix.standard.docs.ClassInfo;
import com.jphenix.standard.servlet.IRequestManager;
import com.jphenix.standard.servlet.api.ICookie;
import com.jphenix.standard.servlet.api.IFilterConfig;
import com.jphenix.standard.servlet.api.IHttpSession;
import com.jphenix.standard.servlet.api.IRequest;
import com.jphenix.standard.servlet.api.IRequestDispatcher;
import com.jphenix.standard.servlet.api.IRequestWrapper;
import com.jphenix.standard.servlet.api.ServletInputStream;

/**
 * 请求对象壳
 * 
 * 2022-09-04 隔离了ServletApi，兼容新老Tomcat
 * 2022-09-05 修改了发现的错误
 * 
 * @author MBG
 * 2022年8月27日
 */
@ClassInfo({"2022-09-07 13:09","请求对象壳"})
public class RequestWrapper implements IRequestManager,IRequestWrapper,HttpServletRequest {

	protected IFilterConfig   filterConfig    = null;  // 过滤器配置参数类
	protected IRequestManager kernel          = null;  // 封装后的核心类
	protected boolean         disabledWrapper = false; // 是否禁止壳处理
	
	/**
	 * 构造函数
	 * @author MBG
	 */
	public RequestWrapper(IRequestManager req) {
		super();
		this.kernel = req;
	}
	
	/**
	 * 构造函数
	 * @author MBG
	 */
	public RequestWrapper(IRequestManager req,IFilterConfig filterConfig) {
		super();
		this.kernel       = req;
		this.filterConfig = filterConfig;
	}

	/**
	 * 覆盖方法
	 * @author 刘虻
	 * 2008-5-13下午02:09:14
	 */
	public IRequest getKernel() {
		return kernel;
	}
	
    /**
     * 覆盖方法
     */
	@Override
	public void setDisabledWrapper(boolean disabled) {
		disabledWrapper = disabled;
	}
	
    /**
     * 覆盖方法
     */
	@Override
	public boolean isDisabledWrapper() {
		return disabledWrapper;
	}
	
    /**
     * 覆盖方法
     */
	@Override
	public void setParameter(String key, String[] value) {
		kernel.setParameter(key,value);
	}

    /**
     * 覆盖方法
     */
	@Override
	public void setParameter(String key, String value) {
		kernel.setParameter(key,value);
	}

    /**
     * 覆盖方法
     */
	@Override
	public String getClientIP() {
		return kernel.getClientIP();
	}

    /**
     * 覆盖方法
     */
	@Override
	public String cip() {
		return kernel.cip();
	}

    /**
     * 覆盖方法
     */
	@Override
	public Map<String, String> getHeaderMap() {
		return kernel.getHeaderMap();
	}

    /**
     * 覆盖方法
     */
	@Override
	public void setBuffered() {
		kernel.setBuffered();
	}

    /**
     * 覆盖方法
     */
	@Override
	public boolean isBuffered() {
		return kernel.isBuffered();
	}

    /**
     * 覆盖方法
     */
	@Override
	public byte[] getPostData() {
		return kernel.getPostData();
	}

    /**
     * 覆盖方法
     */
	@Override
	public String getWebBasePath() {
		return kernel.getWebBasePath();
	}

    /**
     * 覆盖方法
     */
	@Override
	public List<String> getCustomHeaderNameList() {
		return kernel.getCustomHeaderNameList();
	}

    /**
     * 覆盖方法
     */
	@Override
	public Map<String, String> getCustomHeaderMap() {
		return kernel.getCustomHeaderMap();
	}

    /**
     * 覆盖方法
     */
	@Override
	public String getCookieValue(String key) {
		return kernel.getCookieValue(key);
	}

    /**
     * 覆盖方法
     */
	@Override
	public boolean isGet() {
		return kernel.isGet();
	}

    /**
     * 覆盖方法
     */
	@Override
	public boolean isPost() {
		return kernel.isPost();
	}

    /**
     * 覆盖方法
     */
	@Override
	public boolean isNativeServer() {
		return kernel.isNativeServer();
	}

    /**
     * 覆盖方法
     */
	@Override
	public Map<String, String> getUrlParameterMap() {
		return kernel.getUrlParameterMap();
	}

    /**
     * 覆盖方法
     */
	@Override
	public String getUrlParameter(String key) {
		return kernel.getUrlParameter(key);
	}

    /**
     * 覆盖方法
     */
	@Override
	public Object getAttribute(String name) {
		return kernel.getAttribute(name);
	}

    /**
     * 覆盖方法
     */
	@Override
	public Enumeration<String> getAttributeNames() {
		return kernel.getAttributeNames();
	}

    /**
     * 覆盖方法
     */
	@Override
	public String getCharacterEncoding() {
		return kernel.getCharacterEncoding();
	}

    /**
     * 覆盖方法
     */
	@Override
	public void setCharacterEncoding(String env) {
		kernel.setCharacterEncoding(env);
	}

    /**
     * 覆盖方法
     */
	@Override
	public int getContentLength() {
		return kernel.getContentLength();
	}

    /**
     * 覆盖方法
     */
	@Override
	public long getContentLengthLong() {
		return kernel.getContentLengthLong();
	}

    /**
     * 覆盖方法
     */
	@Override
	public String getContentType() {
		return kernel.getContentType();
	}

    /**
     * 覆盖方法
     */
	@Override
	public ServletInputStream iGetInputStream() throws IOException {
		return kernel.iGetInputStream();
	}

    /**
     * 覆盖方法
     */
	@Override
	public Enumeration<String> getParameterNames() {
		return kernel.getParameterNames();
	}

    /**
     * 覆盖方法
     */
	@Override
	public String getProtocol() {
		return kernel.getProtocol();
	}

    /**
     * 覆盖方法
     */
	@Override
	public String getScheme() {
		return kernel.getScheme();
	}

    /**
     * 覆盖方法
     */
	@Override
	public String getServerName() {
		return kernel.getServerName();
	}

    /**
     * 覆盖方法
     */
	@Override
	public int getServerPort() {
		return kernel.getServerPort();
	}

    /**
     * 覆盖方法
     */
	@Override
	public BufferedReader getReader() throws IOException {
		return kernel.getReader();
	}

    /**
     * 覆盖方法
     */
	@Override
	public String getRemoteAddr() {
		return kernel.getRemoteAddr();
	}

    /**
     * 覆盖方法
     */
	@Override
	public String getRemoteHost() {
		return kernel.getRemoteHost();
	}

    /**
     * 覆盖方法
     */
	@Override
	public void setAttribute(String name, Object o) {
		kernel.setAttribute(name,o);
	}

    /**
     * 覆盖方法
     */
	@Override
	public void removeAttribute(String name) {
		kernel.removeAttribute(name);
	}

    /**
     * 覆盖方法
     */
	@Override
	public Locale getLocale() {
		return kernel.getLocale();
	}

    /**
     * 覆盖方法
     */
	@Override
	public Enumeration<Locale> getLocales() {
		return kernel.getLocales();
	}

    /**
     * 覆盖方法
     */
	@Override
	public boolean isSecure() {
		return kernel.isSecure();
	}

    /**
     * 覆盖方法
     */
	@Override
	public IRequestDispatcher iGetRequestDispatcher(String path) {
		return kernel.iGetRequestDispatcher(path);
	}

    /**
     * 覆盖方法
     */
	@Override
	public String getRealPath(String path) {
		return kernel.getRealPath(path);
	}

    /**
     * 覆盖方法
     */
	@Override
	public int getRemotePort() {
		return kernel.getRemotePort();
	}

    /**
     * 覆盖方法
     */
	@Override
	public String getLocalName() {
		return kernel.getLocalName();
	}

    /**
     * 覆盖方法
     */
	@Override
	public String getLocalAddr() {
		return kernel.getLocalAddr();
	}

    /**
     * 覆盖方法
     */
	@Override
	public int getLocalPort() {
		return kernel.getLocalPort();
	}

    /**
     * 覆盖方法
     */
	@Override
	public String getAuthType() {
		return kernel.getAuthType();
	}

    /**
     * 覆盖方法
     */
	@Override
	public ICookie[] iGetCookies() {
		return kernel.iGetCookies();
	}

    /**
     * 覆盖方法
     */
	@Override
	public long getDateHeader(String name) {
		return kernel.getDateHeader(name);
	}

    /**
     * 覆盖方法
     */
	@Override
	public String getHeader(String name) {
		return kernel.getHeader(name);
	}

    /**
     * 覆盖方法
     */
	@Override
	public Enumeration<String> getHeaders(String name) {
		return kernel.getHeaders(name);
	}

    /**
     * 覆盖方法
     */
	@Override
	public Enumeration<String> getHeaderNames() {
		return kernel.getHeaderNames();
	}

    /**
     * 覆盖方法
     */
	@Override
	public int getIntHeader(String name) {
		return kernel.getIntHeader(name);
	}

    /**
     * 覆盖方法
     */
	@Override
	public String getMethod() {
		return kernel.getMethod();
	}

    /**
     * 覆盖方法
     */
	@Override
	public String getPathInfo() {
		return kernel.getPathInfo();
	}

    /**
     * 覆盖方法
     */
	@Override
	public String getPathTranslated() {
		return kernel.getPathTranslated();
	}

    /**
     * 覆盖方法
     */
	@Override
	public String getContextPath() {
		return kernel.getContextPath();
	}

    /**
     * 覆盖方法
     */
	@Override
	public String getRemoteUser() {
		return kernel.getRemoteUser();
	}

    /**
     * 覆盖方法
     */
	@Override
	public boolean isUserInRole(String role) {
		return kernel.isUserInRole(role);
	}

    /**
     * 覆盖方法
     */
	@Override
	public Principal getUserPrincipal() {
		return kernel.getUserPrincipal();
	}

    /**
     * 覆盖方法
     */
	@Override
	public String getRequestedSessionId() {
		return kernel.getRequestedSessionId();
	}

    /**
     * 覆盖方法
     */
	@Override
	public String getRequestURI() {
		return kernel.getRequestURI();
	}

    /**
     * 覆盖方法
     */
	@Override
	public StringBuffer getRequestURL() {
		return kernel.getRequestURL();
	}

    /**
     * 覆盖方法
     */
	@Override
	public String getServletPath() {
		return kernel.getServletPath();
	}

    /**
     * 覆盖方法
     */
	@Override
	public IHttpSession iGetSession(boolean create) {
		return kernel.iGetSession(create);
	}

    /**
     * 覆盖方法
     */
	@Override
	public IHttpSession iGetSession() {
		return kernel.iGetSession();
	}

    /**
     * 覆盖方法
     */
	@Override
	public boolean isRequestedSessionIdValid() {
		return kernel.isRequestedSessionIdValid();
	}

    /**
     * 覆盖方法
     */
	@Override
	public boolean isRequestedSessionIdFromCookie() {
		return kernel.isRequestedSessionIdFromCookie();
	}

    /**
     * 覆盖方法
     */
	@Override
	public boolean isRequestedSessionIdFromURL() {
		return kernel.isRequestedSessionIdFromURL();
	}

    /**
     * 覆盖方法
     */
	@Override
	public String getParameter(String name) {
		return kernel.getParameter(name);
	}

    /**
     * 覆盖方法
     */
	@Override
	public String[] getParameterValues(String name) {
		return kernel.getParameterValues(name);
	}

    /**
     * 覆盖方法
     */
	@Override
	public Map<String, String[]> getParameterMap() {
		return kernel.getParameterMap();
	}

    /**
     * 覆盖方法
     */
	@Override
	public String getQueryString() {
		return kernel.getQueryString();
	}

    /**
     * 覆盖方法
     */
	@Override
	public void setServletPath(String servletPath) {
		kernel.setServletPath(servletPath);
	}

    /**
     * 覆盖方法
     */
	@Override
	public void setWebBasePath(String webBasePath) {
		kernel.setWebBasePath(webBasePath);
	}

    /**
     * 覆盖方法
     */
	@Override
	public void setUrlInfo(String webBasePath, String contextPath, String servletPath, String queryString) {
		kernel.setUrlInfo(webBasePath,contextPath,servletPath,queryString);
	}

    /**
     * 覆盖方法
     */
	@Override
	public void setMethod(String method) {
		kernel.setMethod(method);
	}

    /**
     * 覆盖方法
     */
	@Override
	public void setPostData(Object data) {
		kernel.setPostData(data);
	}

    /**
     * 覆盖方法
     */
	@Override
	public void setContentType(String contentType) {
		kernel.setContentType(contentType);
	}

    /**
     * 覆盖方法
     */
	@Override
	public void setScheme(String scheme) {
		kernel.setScheme(scheme);
	}

    /**
     * 覆盖方法
     */
	@Override
	public void setHeader(String key, String value) {
		kernel.setHeader(key,value);
	}

    /**
     * 覆盖方法
     */
	@Override
	public IRequestManager newInstance() {
		return kernel.newInstance();
	}

    /**
     * 覆盖方法
     */
	@Override
	public void addQueryString(String subQueryString) {
		kernel.addQueryString(subQueryString);
	}

    /**
     * 覆盖方法
     */
	@Override
	public void setContextPath(String contextPath) {
		kernel.setContextPath(contextPath);
	}
	
    /**
     * 覆盖方法
     */
	@Override
	public javax.servlet.ServletInputStream getInputStream() throws IOException {
		return ((HttpServletRequest)kernel).getInputStream();
	}

    /**
     * 覆盖方法
     */
	@Override
	public RequestDispatcher getRequestDispatcher(String path) {
		return ((HttpServletRequest)kernel).getRequestDispatcher(path);
	}

    /**
     * 覆盖方法
     */
	@Override
	public ServletContext getServletContext() {
		return ((HttpServletRequest)kernel).getServletContext();
	}

    /**
     * 覆盖方法
     */
	@Override
	public AsyncContext startAsync() throws IllegalStateException {
		return ((HttpServletRequest)kernel).startAsync();
	}

    /**
     * 覆盖方法
     */
	@Override
	public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException {
		return ((HttpServletRequest)kernel).startAsync(servletRequest,servletResponse);
	}

    /**
     * 覆盖方法
     */
	@Override
	public boolean isAsyncStarted() {
		return ((HttpServletRequest)kernel).isAsyncStarted();
	}

    /**
     * 覆盖方法
     */
	@Override
	public boolean isAsyncSupported() {
		return ((HttpServletRequest)kernel).isAsyncSupported();
	}

    /**
     * 覆盖方法
     */
	@Override
	public AsyncContext getAsyncContext() {
		return ((HttpServletRequest)kernel).getAsyncContext();
	}

    /**
     * 覆盖方法
     */
	@Override
	public DispatcherType getDispatcherType() {
		return ((HttpServletRequest)kernel).getDispatcherType();
	}

    /**
     * 覆盖方法
     */
	@Override
	public Cookie[] getCookies() {
		return ((HttpServletRequest)kernel).getCookies();
	}

    /**
     * 覆盖方法
     */
	@Override
	public HttpSession getSession(boolean create) {
		return ((HttpServletRequest)kernel).getSession(create);
	}

    /**
     * 覆盖方法
     */
	@Override
	public HttpSession getSession() {
		return ((HttpServletRequest)kernel).getSession();
	}

    /**
     * 覆盖方法
     */
	@Override
	public String changeSessionId() {
		return ((HttpServletRequest)kernel).changeSessionId();
	}

    /**
     * 覆盖方法
     */
	@Override
	@Deprecated
	public boolean isRequestedSessionIdFromUrl() {
		return ((HttpServletRequest)kernel).isRequestedSessionIdFromUrl();
	}

    /**
     * 覆盖方法
     */
	@Override
	public boolean authenticate(HttpServletResponse response) throws IOException, ServletException {
		return ((HttpServletRequest)kernel).authenticate(response);
	}

    /**
     * 覆盖方法
     */
	@Override
	public void login(String username, String password) throws ServletException {
		((HttpServletRequest)kernel).login(username,password);
	}

    /**
     * 覆盖方法
     */
	@Override
	public void logout() throws ServletException {
		((HttpServletRequest)kernel).logout();
	}

    /**
     * 覆盖方法
     */
	@Override
	public Collection<Part> getParts() throws IOException, ServletException {
		return ((HttpServletRequest)kernel).getParts();
	}

    /**
     * 覆盖方法
     */
	@Override
	public Part getPart(String name) throws IOException, ServletException {
		return ((HttpServletRequest)kernel).getPart(name);
	}

    /**
     * 覆盖方法
     */
	@Override
	public <T extends HttpUpgradeHandler> T upgrade(Class<T> httpUpgradeHandlerClass) throws IOException, ServletException {
		return ((HttpServletRequest)kernel).upgrade(httpUpgradeHandlerClass);
	}
}
